Codificación
temática
Exploración deductiva y abductiva de textos
Introducción
¿Cuál es la posición de los partidos con relación a la reducción de impuestos? ¿Cuáles mencionan la pobreza o el aumento de la desigualdad en sus manifiestos? ¿En qué textos aparece el tema de la inmigración como amenaza a la integridad social o política del país? ¿Cuáles diputados intervienen durante los plenos en favor de políticas que reduzcan las emisiones y frenen el cambio climático? Cada una de esas preguntas encierra un conjunto de opciones claras en términos empíricos, teóricos y metodológicos. Primero, se basan en el contenido textual como fuente de información empírica. Segundo, establecen la comparación como método, buscando diferencias significativas según partido o ideología. Finalmente, los partidos o diputados se dividen en grupos que hipotéticamente se antagonizan ante ciertas políticas consideradas clave. Existe un comportamiento esperado que se puede o no confirmar a partir de análisis del material seleccionado.
A diferencia de lo que se hizo en el análisis inductivo, ya no se trata de ver aquí qué palabras o términos aparecen en un conjunto de documentos, sino de buscar cómo temas concretos se manifiestan, por quiénes, dónde y en qué contexto. El análisis exploratorio deductivo nos permite evaluar la prevalencia de un tema en los textos, verificar si su distribución resulta uniforme o se concentra de acuerdo con la ideología, el partido político o un momento histórico concreto.
En esta parte del trabajo revisaremos los instrumentos y estrategias disponibles para el desarrollo de temas. Examinaremos diferentes herramientas para determinar el contexto en el que se inscriben, así como determinaremos la prevalencia de distintas categorías analíticas. Haremos especial hincapié en el concepto de diccionario o léxico como el resultado de un proceso de codificación temática y construcción teórica a partir del análisis abductivo resultante de la consulta e iteración constante entre texto (como material empírico fundamental), teoría e interpretación (Thompson 2022; B. L. Kennedy and Thornberg 2018).
El texto siguiente se divide en tres sesiones. El segundo apartado se dedica a las técnicas de búsqueda de palabras en los textos y que resultan muy útiles para situar las ideas en su contexto. La tercera parte trata de la codificación temática a partir de diccionarios. Cómo la construcción y refinamiento de léxicos puede resultar de un proceso iteractivo que da lugar al desarrollo de nuevas categorías analíticas. Finalmente, el cuarto apartado explora los temas para identificar patrones, el grado de asociación entre ellos y su distribución según distintas categorías analíticas (como partidos o ideología, por ejemplo).
Búsqueda de palabras
En el apartado sobre el método inductivo aprendimos a contar palabras. No obstante, en muchas ocasiones, el significado de un término puede variar según el contexto. Según la Real Academia Española (RAE), la palabra “estrella” puede significar tanto un cuerpo celeste como una persona que sobresale en su profesión, por ejemplo. En los estudios políticos palabras como pueblo, democracia o libertad exigen que el analista establezca siempre el contenido concreto asociado a tales expresiones abstractas. El propósito de esta sección consiste en introducir algunas herramientas que permitan determinar el significado de una expresión de forma clara y con menos ambigüedad.
Keyword in Context (Kwic)
Una forma sencilla de contextualizar términos consiste en visualizarlos directamente en los pasajes del texto en que aparecen. El método kwic (keyword in context) extrae de un texto o corpus todos los trechos en los que aparece una palabra y los muestra dentro de un contexto o ventana que puede ser compuesta por una o más expresiones antecedentes y posteriores. En el ejemplo abajo, buscamos la palabra “libertad” en los discursos de investidura de los presidentes españoles, con una ventana de 5 palabras alrededor del término.
Code
# Carga el paquete tenet
library(tenet)
# Crea un corpus (discursos inaugurales Espana)
cp <- corpus(spa.inaugural)
# Crea un data.frame a partir de
# la funcion Keyword in Context de
# Quanteda
d <- kwic(x = tokens(cp),
pattern= "libertad",
window = 5)
# Visualiza los resultados
reactable::reactable(d,
resizable = T,
wrap = F)Como podemos observar, el uso del término libertad varía significativamente según el momento y el presidente en cuestión. Adolfo Suárez lo utiliza en un contexto de transición hacia la democracia, como superación de una etapa anterior autoritaria. Por esa razón, la palabra aparece junto a derechos, instituciones y democracia. Felipe González la utiliza junto a las ideas de igualdad y solidaridad, mientras que Aznar las asocia a la expresión, enseñanza y seguridad. Zapatero introduce el concepto de libertad sexual. Rajoy la asocia a prosperidad e igualdad, mientras que Pedro Sánchez se centra en dos ejes: valores postmateriales (sexual, aborto, eutanasia) y territorial (autonomía de las comunidades autónomas).
Por otra parte, si hacemos un ejercicio y utilizamos el término “empleo”, se puede averiguar que este se refiere casi exclusivamente al mundo laboral y políticas activas de acceso o creación de puestos de trabajo. Solo en dos ocasiones específicas se trata del verbo “emplear” con el significado “utilizar”, como las referencias “emplear una política monetaria” o el “empleo de los caudales públicos”, ambas en el primer discurso de investidura de Felipe González. Por lo tanto, al examinar los resultados, vemos que esos dos casos constituyen una excepción al significado principal de empleo a que hacen referencia todos los discursos.
Árbol de palabras
El árbol de palabras (wordtree) nos brinda una visión semejante al kwic con una diferencia fundamental: cada palabra que compone la frase se dimensiona de acuerdo con la frecuencia con que aparecen en los textos. Este recurso resulta útil para discriminar los usos más comunes de los términos en sus contextos predominantes. De acuerdo con Wattenberg y Viégas (2008, 2–3), corresponde a una alternativa gráfica y exploratoria de visualización de los kwic. Se trata, además, de un recurso interactivo que permite al usuario jugar con los contextos, direccionando su mirada hacia frases concretas o subiendo a patrones más generales. Posee tres características distintivas. Primero, facilita la identificación de repeticiones de palabras. Segundo, tiene una estructura de árbol claramente identificable. Finalmente, facilita la exploración del contexto.
Por lo tanto, representa una herramienta que sirve tanto para la exploración de patrones en los textos durante una primera fase exploratoria de un estudio como de instrumento de comunicación de patrones o temas recurrentes encontrados en los datos. Su interactividad invita tanto a la descubierta como a una mayor atención a los argumentos que se desean transmitir.
El código abajo utiliza la función wordtree del paquete tenet para crear el árbol de palabras alrededor del término libertad. Como podemos ver, el resultado es muy semejante al producido por el kwic. No obstante, ahora nuestra atención se ve atraída por las palabras de mayor tamaño. Las rutas más comunes se evidencian, como es el caso de “de la libertad de expresión”, por ejemplo.
Code
# Crea un arbol de palabras en tenet
wordtree(corpus = cp,
keyword = "libertad",
height = 800)Por otra parte, si filtramos el corpus para que incluya solamente textos de un presidente o partido político, podemos identificar los usos específicos que hacen de los términos y, así, trazar variantes y revelar patrones útiles teóricamente. Seguramente veremos diferencias sustantivas entre Adolfo Suárez y Pedro Sánchez, como hemos podido contrastar en el apartado anterior. Además, será posible identificar de forma más sencilla las expresiones más recurrentes o típicas de cada uno. En el caso de José María Aznar, por ejemplo, la libertad se asocia de forma muy evidente al progreso económico.
Prevalencia en el tiempo
Google Libros, consiste en uno de los servicios más interesantes de Google. Se trata de un proyecto ambicioso que ha llevado a cabo la digitalización y el pre-procesamiento lingüístico masivo de un número enorme de libros en diferentes lenguas. Además de disponibilizar muchos documentos en línea (en su gran mayoría de dominio público), la aplicación realiza el cálculo de una serie de métricas entre las cuales se encuentra la densidad de palabras o expresiones (los n-gramas como ya hemos visto en el capítulo anterior). De ahí surgió el Google N-Gram Viewer, una aplicación que permite mapear la evolución de un término o palabra en una lengua en largos períodos de tiempo.
El paquete ngramr en R permite acceder a los datos de Google N-Gram Viewer y obtener las frecuencias relativas. La función ngrami, por ejemplo, busca una o más palabras sin considerar si está en mayúsculas o minúsculas y retorna un data.frame con los resultados. Estos datos se pueden emplear luego para generar un gráfico.
La gran ventaja de N-Gram Viewer está en su carácter histórico. Revela cómo una palabra o expresión evoluciona en una misma lengua a lo largo de amplios períodos de tiempo. El código abajo realiza la búsqueda de tres infraestructuras clave: los telégrafos, los ferrocarriles y el Internet. A partir del examen de su prevalencia en los libros en español de 1800 a 2019, podemos observar sus distintos ciclos temporales:
Code
# Carga el paquete ngramr
library(ngramr)
# Busca los términos (case-insensitive)
nm <- ngrami(
c("telégrafo",
"ferrocarril",
"internet"),
corpus = "es-2019")# Ngram data table
# Phrases:
# Case-sensitive:
# Corpuses:
# Smoothing:
# Years: 1800-2022
Year Phrase Frequency Corpus Parent type
1 1800 telégrafo (All) 7.850821e-07 es-2019 CASE_INSENSITIVE
2 1801 telégrafo (All) 6.980287e-07 es-2019 CASE_INSENSITIVE
3 1802 telégrafo (All) 6.175318e-07 es-2019 CASE_INSENSITIVE
4 1803 telégrafo (All) 5.662840e-07 es-2019 CASE_INSENSITIVE
5 1804 telégrafo (All) 4.264378e-07 es-2019 CASE_INSENSITIVE
6 1805 telégrafo (All) 3.531117e-07 es-2019 CASE_INSENSITIVE
Code
# Genera un gráfico con los resultados
library(ggplot2)
p <- ggplot(nm,
aes(
x=Year,
y=Frequency,
color=Phrase))+
geom_line()+
theme_classic()+
scale_color_discrete(name="Término")+
labs(
title="Google N-Gramas (1800-2019)",
subtitle = "Densidad de palabras en libros
en español de 1800 a 2019.")+
xlab("Año")+
ylab("Frecuencia relativa")
p
Las curvas no pueden ser más ilustrativas. Los telégrafos presentan una ascensión entre 1850 y 1900 para, luego, entrar en declive. Los ferrocarriles se han comportado de forma similar, aunque aparezcan de forma mucho más frecuente en los libros del período. Internet, una infraestructura mucho más reciente, se ve reflejada a partir de una curva exponencial a partir de los 2000.
No resulta nada difícil replicar la misma lógica en textos que posean alguna secuencia temporal o lógica. Para reproducir el análisis realizado por el NGram Viewer con un corpus no previamente preparado necesitamos llevar a cabo dos tareas centrales. La primera consiste en crear una función que busque algunos términos o expresiones en el corpus y, luego, calcule su densidad. En el segundo paso se organiza la base de datos de modo que cada unidad textual refleje una unidad de tiempo. Por ejemplo, podemos aglutinar los documentos por día, mes, año o cualquier medida que convenga al investigador. Lo importante es que las unidades sean homogéneas y comparables entre sí.
Una de las bases de datos de ejemplo incluidas en el paquete tenet se conforma por todas las intervenciones parlamentarias durante la XIV Legislatura del Congreso de Diputados de España, vigente entre diciembre de 2019 y junio de 2023. La base original contiene la intervención de cada diputado y la fecha en la que se ha realizado. Por esa razón, resulta relativamente sencillo agregar los textos por fecha. No se recomienda el uso de días, pues los intervalos entre sesiones no resulta uniforme. Algunas semanas contienen dos o más sesiones, mientras que otras apenas se reúnen. Por esa razón, emplearemos en nuestro ejemplo el mes como unidad de comparación de tiempo.
El panel abajo contiene la descripción detallada de cada paso:
Empezaremos por crear una función llamada countNgram con cinco parámetros o argumentos. El primero, keywords, informa cuáles son los términos que deseamos buscar. El segundo, corpus, se refiere al conjunto de textos que serán utilizados como base para el recuento. En tercer lugar, time, suministra la referencia secuencial de tiempo (o de identificación) para cada uno de los textos contenidos en corpus (en nuestro caso los meses). Por esa razón, el número de elementos de esos dos últimos argumentos debe ser siempre igual. Cuarto, rel.freq establece si se calculará la frecuencia absoluta o la relativa. Se calcula por defecto a menos que se defina rel.freq=FALSE. Finalmente, remove.accent permite eliminar las tildes y signos de acentuación de los textos y de las palabras claves. Por ejemplo, si no eliminamos los acentos, la palabra clave “religio” regresará solo “religioso”, “religiosidad”, “religiosa”, “religiosamente” y excluirá “religión”. Está definidaa como verdadero por defecto, remove.accent=TRUE.
Code
# Función countNgram, que cuenta el
# número de veces un conjunto de palabras
# aparece en un corpus.
countNgram <- function(keywords,
corpus=NULL,
time=NULL,
rel.freq=TRUE,
remove.accent=TRUE){
# En el caso de que sea un diccinario,
# permite identificar la categoría o dimension
# a que pertenece la palabra clave.
dicio <- quanteda::is.dictionary(keywords)
if(dicio==TRUE){
dct <- keywords
kw <- unlist(dct)
nm <- stringi::stri_replace_all_regex(names(kw),"[0-9]+","")
dt <- data.frame(dimension=nm, Keyword=kw)
keywords <- kw
}
# Elimina tildes y signos de acentuación
if(remove.accent==TRUE){
corpus <- stringi::stri_trans_general(corpus, "Latin-ASCII")
keywords <- stringi::stri_trans_general(keywords, "Latin-ASCII")
}
# Cuenta todos los términos de la lista
tt <- outer(corpus,
keywords,
stringi::stri_count_regex)
# Nombre cada columna de la matriz de resultados
# con los términos
colnames(tt) <- keywords
# Transforma los resultados en data.frame
tt <- data.frame(tt)
# Si se desea la frecuencia relativa
if(rel.freq==TRUE){
# Cuenta todas las palabras de todas
# las intervenciones de cada mes
count <- stringi::stri_count_words(corpus)
# Calcula la frecuencia relativa
for(i in 1:ncol(tt)){
tt[,i] <- tt[,i]/count
}
}
# Añade la identificación del tiempo
# (en nuestro caso el mes)
tt$Time <- time
# Cambia el formato de los datos
# (importante para generar el gráfico
# en un formato ggplot2)
tt <- reshape2::melt(tt, id.vars = "Time")
# Asigna los nombres de las columnas
names(tt) <- c("Time","Keyword","Density")
# Si es un diccionario, adiciona la
# una variable identificando la dimension
if(dicio==TRUE){
tt <- merge(tt, dt, by="Keyword")
}
# Devuelve el resultado final
return(tt)
}En el paso siguiente, creamos una copia de la base de datos de intervenciones legislativas, identificamos el mes en el cual se ha realizado y aglutinamos todas las intervenciones en una sola unidad de textos según la nueva unidad de tiempo. Tales “intervenciones del mes” serán empleadas en la recién creada countNgram para calcular la densidad de los términos “sexual” e “inmigra” que incluyen todo relativo a los derechos sexuales e inmigración. El código describe cómo hacerlo paso a paso y la tabla exhibe los resultados.
Código
# Crea una copia de los diarios de sesiones del
# Congreso de Diputados de España
ss <- spa.sessions
# Genera una variable con el mes de cada
# intervención de cada diario de sesiones
ss$mes <- as.Date(
paste0(
substr(
ss$session.date,
1,
7),
"-01"))
# Junta todas las intervenciones de un
# mismo mes en un largo texto
ss <- aggregate(list(texto=ss$speech.text),
by=list(mes=ss$mes),
paste0,
collapse="\n")
# Ejecuta la función que cuenta los términos
# por unidad de tiempo (en el caso cada mes)
res <- countNgram(
keywords = c("sexual","inmigra"),
corpus = ss$texto,
time = ss$mes)
# Multiplica la frecuencia relativa por 10 mil
# para facilitar la lectura de los datos y
# reduce el número de dígitos decimales a 2.
res$Density <- round(res$Density*10000,2)
# Enseña los resultados
reactable(res,
resizable = T)Finalmente, el último paso para reproducir el ejemplo anterior con base en datos de Google NGram Viewer consiste en crear un gráfico. El código abajo hace justamente eso:
Código
# Carga el paquete ggplot2
library(ggplot2)
library(ggiraph)
# Renombra las variables para
# que aparezcan mejor en el gráfico
names(res) <- c("Mes","Keyword","Densidad")
# Genera un gráfico de línea con
# la evolución por mes de cada
# término
p <- ggplot(res,
aes(
x=Mes,
y=Densidad,
color=Keyword))+
geom_line()+
theme_classic()+
theme(legend.position="bottom")+
scale_color_discrete(name="Término")+
labs(
title="Sesiones legislativas del Congreso
de Diputados (2019-2023)",
subtitle = 'Densidad de palabras conteniendo
"inmigra" y "sexual" en los diarios
de sesiones del Congreso\nde Diputados
de España entre diciembre de 2019 y
junio de 2023.')+
xlab("Año")+
ylab("Frecuencia (a cada 10 mil)")
# Visualiza los resultados
p
El examen de los resultados de la tabla y del gráfico revela dos picos, uno para cada palabra. En el caso de expresiones relacionadas a “sexual” este se encuentra en octubre de 2021, cuando se ha llevado a cabo el debate sobre la propuesta de la Ley Orgánica Garantía de la Libertad Sexual (la ley del “sí es sí”). Para “inmigra”, se trata de agosto de 2020, mes en el cual tuvo lugar una sesión de la diputación permanente en la que se aborda explícitamente el tema de la inmigración irregular ocurrida en ese verano.
Code
library(tenet)
# Selecciona los principales diputados de
# Vox en la XIV legislatura
ag <- spa.sessions[
spa.sessions$rep.name%in%
c("Abascal Conde, Santiago",
"Espinosa de los Monteros de Simón, Iván",
"Olona Choclán, Macarena",
"Ortega Smith-Molina, Francisco Javier"),]
# Reduce los nombres
ag$rep.name[ag$rep.name=="Abascal Conde, Santiago"] <- "Abascal"
ag$rep.name[ag$rep.name=="Espinosa de los Monteros de Simón, Iván"] <- "Espinosa "
ag$rep.name[ag$rep.name=="Olona Choclán, Macarena"] <- "Olona"
ag$rep.name[ag$rep.name=="Ortega Smith-Molina, Francisco Javier"] <- "Ortega Smith"
# Create a variable of month for smoothing the data
ag$month <- substr(ag$session.date,3,7)
# Aggregate words by representative and month
ag <- aggregate(
list(words=ag$speech.tokens),
by=list(
month=ag$month,
rep=ag$rep.name,
party=ag$rep.party),
sum,
na.rm=T)
# Order the data by month
ag <- ag[order(ag$month),]
plotStream(ag,
x="month",
y="words",
group="rep", elementId = "elem223")Code
plotGrid(ag,
x="month",
y="rep",
size="words",
color="rep",
width_svg = 9, height_svg = 4,
leg.size="Palabras",
leg.color="Diputado",
grid.color="grey99")Etiquetado automático de textos
Una tarea central de cualquier análisis cualitativo de texto consiste en la lectura atenta y la selección de pasajes o términos para la codificación temática. Se trata de un proceso iterativo -con muchas idas y venidas, revisiones y cambios- en el cual el investigador marca o subraya trechos o palabras del documento y les asigna un código o categoría analítica. En ese sentido, la lectura orienta el proceso de codificación y clasificación, dando lugar al surgimiento de conceptos más abstractos. Aunque la investigación parta de algunas nociones previas, esta fase exploratoria consiste en la clave para la vinculación de elementos concretos presentes en el texto a temas teóricos más amplios. Existe cierto consenso en la literatura sobre el tema que considera la clasificación temática como el resultado (y no el punto de partida) del análisis cualitativo (Saldana 2015, 13; Krippendorff 2004; Neuendorf 2017; Guest, MacQueen, and Namey 2011; Miles, Huberman, and Saldana 2019; Auerbach and Silverstein 2003). Es el producto de la interacción entre el analista y el texto.
Por esa razón, se necesitan instrumentos que faciliten tal interacción entre el investigador y el texto, que les permitan partir de algunas semillas y profundizar en las sucesivas capas de análisis hasta encontrar los temas centrales de su investigación. En este apartado introduciremos dos opciones de etiquetado y visualización de textos. Constituyen recursos que permiten lo que algunos autores (Saldana 2015, 13) denominan como pre-codificación, como el sublineado o coloreado de pasajes del texto con el propósito de identificar pasajes útiles para la generación de hipótesis o la creación de conceptos.
El etiquetado toma un texto único y examina la presencia de un conjunto de palabras-clave o expresiones definidas por el investigador. Si se busca, por ejemplo, saber cómo los presidentes mencionan las políticas sociales en sus discursos, no sería raro que se empezara buscando referencias a la seguridad social, sanidad, educación, pobreza o desigualdad. Estudiosos del populismo, por otra parte, buscarían referencias a patria, pueblo, nación, o élites.
La función tagText del paquete tenet permite realizar dicha tarea. Su utilidad consiste en subrayar un texto concreto según una lista de palabras-clave. Su propósito resulta muy sencillo: ayudar en la creación de códigos. El usuario puede leer el texto y al mismo tiempo, crear un diccionario o una lista de palabras que resultan particularmente expresivas de una idea o concepto que se desea capturar.
El código abajo selecciona el discurso de investidura de Adolfo Suárez y subraya todas las palabras que contengan las raíces “politic”, “acci”, “conflict”, “partid”, “defensa”, y la expresión “fuerzas armadas”. A cada palabra asocia un color para que sea más fácil su identificación en el texto. De ese modo, se puede ver dónde aparecen.
Code
# Examina un conjunto de palabras en el
# discurso de investidura de Adolfo Suárez
tagText(as.character(spa.inaugural$text[1]),
keywords = c("politic",
"acci",
"conflict",
"partid",
"defensa",
"fuerzas armadas"),
palette = pal$cat.wesanderson.AsteroidCity2.6,
font.size = 18,
title = "Adolfo Suarez (1979)",
margin = 100)Como se puede observar, a cada raíz, palabra-clave o expresión le corresponde un color distinto. Este atributo favorece no solo la identificación de su posición en el texto, sino que también los distingue y subraya cuando coinciden en un mismo párrafo o sentencia. Sitúa, contextualiza, compara y, sobre todo, mantiene el lector anclado al texto.
Una queja o desconfianza de ciertos investigadores cualitativos frente a métodos asistidos por ordenador tiene que ver con el distanciamiento que éstos últimos provocan con relación a las fuentes textuales. No obstante, el proceso no tiene que implicar una tal dicotomía si se emplean herramientas adecuadas para el examen de patrones textuales.
La función tagText también se puede utilizar en conjunción con diccionarios. Resulta útil para averiguar la consistencia de la codificación desarrollada, así como permite perfeccionar los códigos existentes. La estructura de un diccionario resulta sencilla. A cada código corresponde un conjunto de términos, raíces o expresiones. Al emplear un diccionario en tagText todos los elementos de un código se representan bajo un mismo color. De ese modo, resulta más fácil no solo ubicar las categorías, sino también ver hasta qué punto aparecen en un mismo pasaje del documento. Más adelante, cuando tratemos del proceso de codificación por medio de diccionarios emplearemos algunos ejemplos.
Dispersión léxica
En ciertas ocasiones interesa saber no solo cuántas veces una palabra aparece en un texto o corpus, sino dónde. El lugar en que se manifiesta una idea puede ser muy significativo para determinar su importancia en un discurso. ¿Está por todo el texto o aparece solamente en algunas partes? ¿Qué documentos poseen mayor o menor concentración?
El gráfico de dispersión léxica (lexical dispersion plot) representa una excelente visualización para determinar la localización de un conjunto de palabras-clave en distintos pasajes o sentencias de documentos de componen un corpus y, por lo tanto, su grado de dispersión (o concentración). La función plotLexDiv del paquete tenet permite crear el gráfico a partir de un conjunto de palabras clave (o incluso de un diccionario). El paquete quanteda.textplots también dispone de una función semejante, pero limitada a una sola palabra de cada vez y que no permite la agregación de términos bajo una misma categoría de un diccionario.
El código abajo explora dos maneras en las que los presidentes de gobierno españoles se refieren a los ciudadanos del país. La primera, con énfasis más patriótico, se centra en las expresiones “españoles” y “españolas”. La segunda, con un carácter más republicano, enfoca la membresía a la comunidad política bajo los términos “ciudadanos” y “ciudadanas”. ¿Existen diferencias en el uso de esos dos modos de representar a los miembros de la sociedad española? ¿Su presencia resulta concentrada o dispersa, es decir, se trata de algo muy concreto en una parte de los discurso o aparece en todo el texto como una expresión recurrente y articuladora de las demás partes?
Code
# Genera el primer gráfico con las
# palabras "españoles" y "españolas"
p1 <- plotLexDiv(cp,
title = "Españoles",
keywords = c("espanoles","espanolas"),
custom.color = "red3")
# Genera el segundo gráfico con las
# palabras "ciudadanos" y "ciudadanas"
p2 <- plotLexDiv(cp,
title = "Ciudadanos",
keywords = c("ciudadanos","ciudadanas"),
custom.color = "blue")
# Carga los paquetes necesarios para
# pegar los dos gráficos como una única
# imagen
library(grid)
library(gridExtra)
# Genera la visualización final
grid.arrange(p1,p2, nrow=1)
Una breve inspección visual revela que hay diferencias entre los presidentes en el uso de una u otra forma. Mariano Rajoy aparece como el más enfático usuario de “españoles”, mientras que Felipe González se decanta por “ciudadanos”. Otros se refieren a ambos términos, lo que exige un escrutinio más detenido para entender el contexto del uso de cada. En algunos documentos las expresiones aparecen a lo largo de toda la extensión, mientras que en otros, como españoles en Zapatero II o ciudadanos en Calvo Sotelo, solo en pasajes concretos.
Code
# Crea un corpus con los discursos
cp <- corpus(spa.inaugural)
# Crea un diccionario con las dos categorías
dic <- dictionary(
list(españoles=c("españoles","españolas"),
ciudadanos=c("ciudadanos","ciudadanas")))
# Genera la tabla de posiciones
ter <- filterWords(cp, dic)
# Define el orden
or <- c("Suárez","Calvo Sotelo","González I","González II","González III","González IV","Aznar I","Aznar II","Zapatero I","Zapatero II","Rajoy I","Rajoy II","Rajoy III","Sánchez I","Sánchez II","Sánchez III")
# Convierte la variable de nombres en factor
ter$name <- factor(ter$name,
levels = or,
labels = or)
# Genera el gráfico
plotSpike(ter,
label.size = 4,
ring.width = 0.5,
line.width = 0.4,
title="Españoles y ciudadanos en los discursos de inauguración",
legend.title = "Término: ")Code
# Genera el gráfico
plotSpike(ter,
polar = F,
label.size = 4,
ring.width = 0.5,
line.width = 0.4,
title="Españoles y ciudadanos en los discursos de inauguración",
legend.title = "Término: ")Filtrado de textos: la ratio Documento/Corpus
Cuando se trabaja con muchos textos, uno de los mayores retos consiste en separar el material útil del montón de información que no se desea emplear, al menos en un principio. Por eso, hacen falta estrategias de selección o filtrado de documentos que permitan arrojar luz sobre aquellos documentos que contienen material sustantivo para la investigación.
En muchos casos, basta con buscar aquellos documentos que contienen una expresión o palabra. No obstante, ¿qué pasa cuando esta palabra aparece en varios documentos, pero ni todos ellos son relevantes? En estos casos, hace falta algún criterio que permita discriminar de forma ponderada su peso relativo en un corpus.
La ratio Documento - Corpus de una palabra constituye una solución posible para este problema. Se trata de una medida que evalúa cuán marcada resulta la aparición de un término concreto en cada documento frente a su frecuencia relativa media en todo el corpus. Una cifra superior a uno en un documento indica una prevalencia más alta que la media y, a la inversa, un valor inferior a uno señala un aparecimiento menos frecuente.
\[fd/fc = \frac{Fd_{i}}{F_i}\]
Donde:
Fdi corresponde a la frecuencia relativa del término i en del documento d.
Fi corresponde a la frecuencia relativa del término i en todo el corpus.
Puesto que los textos que componen un mismo corpus pueden presentar distinto tamaño, se utiliza la frecuencia relativa para evitar distorsiones y garantizar la comparabilidad de los resultados.
Hemos creado la función tfRatio en el paquete tenet con el objetivo de calcular la ratio de una palabra-clave, raíz o expresión en todos los documentos de un corpus. Genera una lista con la ratio del término para cada documento o una lista de los documentos que superan un cierto umbral (por medio de los parámetros threshold y return.selected).
El código abajo calcula la ratio de la raíz “machis” (machismo, machista) para todos los discursos de investidura de los presidentes de gobierno españoles:
Code
# Calcula la ratio de las palabras que
# contienen "machis" en el corpus de
# los discursos de investidura
tfRatio(cp, "machis") [1] 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.72 0.00 0.00 0.00 3.07 2.15
[16] 4.67
Como podemos observar, solamente tres de los 15 textos contienen alguna referencia al machismo. Estos son los dos discursos de Pedro Sánchez y el primero de José Luis Rodríguez Zapatero.
Si queremos seleccionar los textos, el parámetro threshold permite establecer un mínimo para que un documento se considere relevante y el argumento return.selected retorna el índice del documento en lugar el la ratio. El código abajo utiliza las ratios para seleccionar los textos en los que palabras como machismo o machista aparezcan más del doble de veces que en la media de todo el corpus (threshold=2):
Code
# Convierte los textos en un data.frame
tx <- convert(cp, "data.frame")
# Selecciona con relacion a la ratio
sx <- tx[tfRatio(cp,
"machis",
threshold = 2,
return.selected = T),]
# Visualiza los resultados
reactable(sx,
resizable = T,
wrap = F)Ahora el investigador puede utilizar otras herramientas como el tagText, los árboles de palabra, la dispersión léxica o el kwic para analizar los textos y entender cómo cada uno de ellos trata el tema del machismo. Al reducir de forma clara el tiempo de selección de los textos relevantes, esta medida posibilita concentrar esfuerzos en otras tareas de análisis.
Codificación temática con diccionarios
La codificación temática consiste en una de las estrategias más comunes en las ciencias sociales para tratar datos en forma de texto. De forma muy resumida, representa un proceso fundamentado en la lectura profundizada de una cantidad limitada de textos y acompañada de anotaciones que permitan extraer temas o conceptos que ayuden en el desarrollo o teste de hipótesis.
De acuerdo con Krippendorff (2004, 18) el análisis de contenido constituye una técnica que permite la realización de inferencias a partir de textos en el contexto en que se emplean. Neuendorf (2017, 1), por otra parte, define el método como el “análisis sistemático, objetivo y cuantitativo de las características de un mensaje”. Otros autores (Saldana 2015; Miles, Huberman, and Saldana 2019) extienden el proceso de codificación más allá del análisis de contenido y mencionan un número más amplio de métodos que se basan en el examen detenido de información textual, como el análisis de discurso, la teoría fundamentada (grounded theory) o el análisis narrativo.
La codificación de temas y la extracción de insights teóricos es una constante en la literatura sobre los métodos cualitativos en las ciencias sociales. En algunos casos, se considera un proceso casi artesanal basado en la lectura profunda y un conocimiento detallado de los textos y sus contextos. En otros, la existencia de volúmenes masivos de documentos invita a la combinación entre: (a) el escrutinio atento de una muestra de los documentos y (b) métodos cuantitativos que permitan sintetizar y clasificar un masa de material imposible de examinar de forma tradicional.
Expresiones, códigos, temas
Resulta útil iniciar este apartado con una breve distinción entre expresiones (términos, palabras o n-gramas), códigos (etiquetas que sintetizan el contenido) y temas (constructos teóricos derivados del análisis). De forma resumida, se puede argumentar que las primeras indexan los textos (conectan palabras a ideas) y ayudan a seleccionar atributos o pasajes que pueden ser particularmente significativas o teóricamente relevantes. Los siguientes (códigos) posibilitan aunar los términos en grupos o colecciones y llevar a cabo un esfuerzo de agregación o síntesis conceptual previo al desarrollo de conceptos más abstractos. Finalmente, un tema emerge del análisis de los distintos códigos, sus contextos y relaciones recíprocas.
Imaginemos que deseamos saber la posición de distintos partidos sobre las políticas sociales. Una forma de encontrar informaciones consiste en buscar palabras como pobreza, desigualdad, ayudas, sanidad, educación, seguridad social, asistencia social, transferencias, entre otros términos. En su conjunto, tales expresiones permiten ubicar en los diferentes documentos de un corpus cuánto y dónde se ha mencionado alguna de esas medidas o asuntos relacionados. Por lo tanto, actúan como instrumentos de búsqueda e indexación de categorías abarcadoras, que pueden estar reunidas en códigos que ayuden a identificar cada aspecto mencionado con la noción general de política social. Sin este paso, resulta muy complicado filtrar aquellos pasajes más destacados sobre ese tema en corpus con muchos documentos. Tampoco se podría calcular su peso relativo: ¿cuál política recibe un número mayor de menciones: la sanidad o la educación?
Los códigos son, a su vez, “etiquetas que atribuyen significado simbólico a información descriptiva o inferencial compilada durante un estudio” (Miles, Huberman, and Saldana 2019, 78–79). Tales “etiquetas” pueden ser palabras o expresiones que permitan atribuir un sentido más amplio, sea descriptivo o conceptual, a la palabra o trecho al que se le asocia. También pueden considerarse como dispositivos de segmentación y aglomeración de significados. Al asociar un conjunto diverso de palabras a los términos izquierda y derecha, por ejemplo, establecemos qué partes se aúnan dentro de esas categorías y, al mismo tiempo, las separamos del resto del texto (diagrama 1).
Diagrama 1. Ejemplos de términos y expresiones, así como de códigos de primer y segundo nivel en un diccionario con las categorías izquierda y derecha.
Además, los códigos facilitan la búsqueda, clasificación y ordenamiento de la información según los intereses del investigador. De cierto modo, sintetizan la diversidad de términos y expresiones en un número reducido de categorías o marcadores. Corresponden a una heurística, un método de descubierta (Miles, Huberman, and Saldana 2019, 80). Al reestructurar los textos de acuerdo a categorías analíticamente significativas, permite identificar patrones, establecer la relación entre códigos y desarrollar interpretaciones analíticas de más alto nivel. En cierto sentido, constituyen una herramienta para estructurar el texto y permitir su recomposición bajo lógicas analíticas distintas.
Finalmente, los temas constituyen construcciones teóricas derivadas del análisis de los códigos. Pueden surgir del examen de un, diez o cien mil documentos. Todo va a depender del diseño de la investigación y cómo cada investigador construye sus categorías analíticas, abstrayendo temas más generales a partir de códigos encontrados en los textos. El tipo y el grado de abstracción dependerá de los objetivos definidos para cada estudio. No obstante, el método suele ser siempre el mismo: la definición de códigos, su análisis y la posterior síntesis en un conjunto de temas clave y teóricamente significativos.
Asociar códigos a los textos, por lo tanto, permite extraer información valiosa para la investigación. Como hemos señalado, un código puede estar asociado tanto a una palabra en concreto como a pasajes enteros. Por esa razón, cabe subrayar que el método propuesto en este trabajo resulta un poco distinto de la codificación tradicional y representa una alternativa híbrida entre métodos puramente cuantitativos y la construcción de un sistema cualitativo tradicional. Aquí, la búsqueda de raíces, palabras o expresiones se utiliza para identificar e indexar dónde una determinada idea aparece en el documento.
Tales elementos empíricos fundamentales pueden estar aislados y servir para un examen preliminar del corpus o agregados según categorías analíticas. Los códigos también pueden anidarse en una estructura jerárquica, como ramas e un árbol. Como vimos en el diagrama 1 arriba, los términos y expresiones “derecho aborto”, “cambio climático” y “transex” conforman la categoría “progresismo”. Ya “educ”, “pobreza” y “social” se aúnan en “igualdad social”. Finalmente, los dos códigos (progresismo e igualdad social) componen la categoría más abstracta “izquierda”.
En resumen, un código agrupa términos básicos en categorías analíticas más o menos homogéneas internamente y distintas entre sí. De ese modo, un código se constituye a partir de: (a) una recolección de esas unidades textuales básicas (más que de frases o trechos enteros) o (b) de otros códigos con menores niveles de abstracción.
Tal estrategia puede considerarse a primera vista como limitante. No obstante, presenta dos grandes puntos fuertes. En primer lugar, palabras o expresiones cortas sirven como elementos útiles para la selección de pasajes más amplios de forma automática y el filtrado de contenido relevante. Al emplearse en conjunto con las herramientas de visualización disponibles, como el kwic y el etiquetado de textos resulta más facil situar las ideas en su contexto sin tener que examinar de antemano largos pasajes de textos.
Segunda ventaja: el uso de palabras, bigramas o trigramas es indudablemente más fácil de cuantificar y comparar en grandes corpus de texto. Resulta mucho más sencillo (y rápido) comparar “machis” en 10 mil documentos que frases concretas que solo indirectamente mencionan el tema del machismo. Para estos últimos casos, estrategias complementarias, como la inclusión de metáforas u otras alusiones indirectas relevantes puede ayudar en su identificación. Cuando el número de documentos es inabarcable desde una metodología tradicional, una alternativa útil consiste en combinar la lectura profundizada de una muestra cuidadosamente seleccionada de textos con algoritmos que permitan rastrear la presencia de códigos en todo el material disponible.
Este método implica un cambio en la forma de construcción de los códigos. Aún más cuando empleamos diccionarios (o léxicos) temáticos como instrumento. La inclusión de una palabra o n-grama en los diccionarios hace con que nuevos pasajes salgan a la luz. La clave se encuentra en analizar las frases o párrafos que contienen tales expresiones y, a partir de ahí, refinar el mismo léxico, desarrollar códigos más abstractos y generar temas teóricamente relevantes para el estudio. Como se ha señalado más arriba, no se trata de abandonar un enfoque cualitativo, sino adaptarlo a situaciones en las que la lectura exhaustiva y en profundidad del corpus resulta imposible o poco práctica.
Diccionarios como colecciones de códigos
Como se ha mencionado más arriba, los diccionarios pueden considerarse como dispositivos de ensamblaje de expresiones de interés teórico o como instrumentos de organización de ideas. Permiten la aglutinación de términos en categorías analíticas más amplias y su posterior organización en estructuras conceptuales jerárquicas.
El diagrama 1 más arriba nos muestra como ciertas raíces, palabras o expresiones se agrupan en categorías como progresismo, conservadurismo, liberalismo económico o igualdad social y éstas en códigos más abstractos como izquierda o derecha. Este breve diccionario nos ayuda a asociar términos que se pueden encontrar en los textos a conceptos o ideas más abstractas, sin una manifestación empírica directa. De ese modo, la izquierda se compone por dos dimensiones -igualdad social y progresismo-, mientras que la derecha se caracteriza como la combinación entre liberalismo económico y conservadurismo social.
Aunque esté muy lejos de brindar una definición exhaustiva de los conceptos de derecha e izquierda, este pequeño ejemplo ilustra cómo un diccionario permite asociar elementos empíricos concretos encontrados en los textos a dimensiones teórico-conceptuales más abstractas.
Por esa misma razón, se debe subrayar la naturaleza iterativa del proceso. Las categorías más abarcadoras (como progresismo, por ejemplo) se suelen construir a partir de un proceso reiterado de examen de los textos, la inclusión de nuevos términos y la revisión de los resultados. Incluso en los casos en que se dispone de un diccionario previo hecho por otros, resulta fundamental la adaptación a los propósitos de investigación para alcanzar los mejores resultados.
La creación de un diccionario representa una técnica de medición y búsqueda (Neuendorf 2017, 126–27) en la el uso de palabras y otros elementos textuales permiten identificar la presencia de ciertas ideas o conceptos en un corpus determinado. También se le podría considerar como un libro de códigos, una compilación de categorías y los elementos que le componen. La formalización explícita de los grupos y su documentación facilita el trabajo en grupo y aumenta la transparencia y reproducibilidad de al menos parte del análisis realizado (Saldana 2015, 21).
El ejemplo abajo crea un diccionario que clasifica 39 términos según los códigos “economía”, “fiscal”, “educación”, “sanidad” y “medioambiente”. Luego, lo emplea en conjunción con la función tagText para resaltar las categorías en el discurso de investidura de Adolfo Suárez. Al analizar los resultados, vemos que a cada categoría (o código) corresponde un color cuyo nombre se revela al mover el cursos sobre una palabra subrayada.
Code
# Crea un diccionario de algunos términos políticos
dic <- dictionary(
list(
economica=c("econom",
"inversion",
"empresa",
"desarroll",
"monetari",
"industri",
"agric",
"agrari"),
fiscal=c("hacienda",
"gasto",
"impuest",
"presupuest",
"tribut",
"tasa",
"fiscal"),
educacion=c("educa",
"profesor",
"docent",
"escuel",
"colegio",
"universi",
"formación"),
sanidad=c("sanidad",
"salud",
"hospital",
"sanitari",
"médic",
"enfermer",
"salud"),
medioambiente=c("sostenible",
"cambio clima",
"medioambient",
"reciclaje",
"ecológico",
"límpia",
"invernadero",
"emisiones",
"carbono",
"plástico",
"fósiles")))
# genera un texto para ser leído en el panel
# Viewer de RStudio
tagText(spa.inaugural$text[1],
keywords = dic,
palette = pal$cat.cartocolor.prism.11,
font.size = 18,
title = "Adolfo Suarez (1979)",
margin = 100)El resultado nos sitúa en un espacio entre una búsqueda automatizada de términos y la codificación manual. Al aplicar el diccionario a un texto específico, se puede observar no solo dónde las categorías aparecen más o menos, sino también cómo estas se asocian entre ellas en un mismo párrafo, por ejemplo. Algunos pasajes son monotemáticos, inciden sobre una idea clave. Otros interesan por la asociación entre conceptos distintos. En muchas ocasiones es justamente la asociación entre temas lo que permite el surgimiento de nuevas hipótesis. Además, el análisis de la incidencia de los códigos en el texto invita a la revisión del diccionario para incorporar nuevos términos o categorías y, de ese modo, completar el análisis.
Miles et al. (2019, 86) sugieren que un método para utilizar diccionarios como herramientas para la codificación consiste en crear una lista provisional de códigos por medio de un proceso deductivo a partir de las referencias teóricas que sirven de marco para el estudio. Una vez elaborada, puede servir de semilla para el examen de los textos y pasar por procesos sucesivos de adaptación, refinamiento y elaboración con el empleo de una codificación inductiva complementaria.
Este proceso de revisión constante requiere instrumentos que permitan explorar, ordenar, filtrar y sintetizar la información. La función tagCorpus de tenet emplea una tabla interactiva que permite a los usuarios llevar a cabo una serie de tareas de exploración de los términos y códigos de un diccionario en todo un corpus. Por lo tanto, se centra en posibilitar la identificación tanto de aspectos compartidos como de señas distintivas entre documentos, categorías o actores. Además, permite examinar de forma sumaria la coocurrencia de códigos en frases o párrafos.
El paquete tenet también incluye un diccionario de ejemplo llamado dic.pol.es. Se trata de un conjunto de códigos que analizan diferentes dimensiones de los discursos políticos. Contiene tres niveles: (1) palabras o expresiones, (2) códigos de primer nivel y (3) códigos de segundo nivel. Por ejemplo, “izquierda unida” pertenece al código nivel-1 “partidos” y al código nivel-2 “actores”. Por su parte, “ilustres” pertence a “retórica” (nivel-1) y a “discurso” (nivel-2).
El código abajo utiliza la función tagCorpus y el diccionario dic.pol.es para identificar la incidencia de las categorías en cada sentencia del corpus de los discursos de investidura españoles. Como se podrá ver, abajo, el resultado es una tabla con siete columnas. La primera Order corresponde al orden de la frase en el documento X (columna Doc.). De ese modo, Order igual a 1 y Doc. igual a Suárez corresponde a la primera frase del discurso de investidura de Adolfo Suárez. Paragraph corresponde a la unidad textural, que puede ser el documento completo (documents), párrafos (paragraphs) o oraciones (sentences). Las categorías más frecuentes aparecen en la columna siguiente (Main Category) y todas las categorías encontradas en la columna Paragraph aparecen en All Categories, incluídas, por supuestos, las más frecuentes. Matches informa el número de veces una palabra o término del diccionario se ha encontrado en el texto. Finalmente, Cat. No. informa el número total de categorías encontradas.
Adicionalmente, debajo del nombre de cada columna, se pueden encontrar campos de filtro. Basta digitar cualquier valor o texto para seleccionar los resultados. Por ejemplo, si uno desea saber cómo Calvo Sotelo trataba temas sociales, puede seleccionar solo los documentos que se inicien por “Calvo” y que, en All Categories, incluya el código “social”. Al hacer clic sobre el nombre de cada columna también se pueden ordenar los valores de forma ascendente o descendente.
Code
# tagCorpus, hace algo parecido para un corpus
tagCorpus(cp,
defaultPageSize = 4,
dic.pol.es,
palette = pal$cat.ggthemes.tableau.20,
reshape.to = "sentences",
show.details = T)Consideremos otro ejemplo. Si queremos identificar cuáles actores sociales y políticos mencionados en los discursos de investidura de los presidentes españoles que estén vinculados al tema tecnológico, podemos filtrar las sentencias del corpus en las que el tema principal (Main Category) son los “actores” y en que también aparezcan (All Categories) “tecnologia”.
Vemos que la concepción tecnológica de los presidentes pasa por una actuación clave de empresas y del mercado. Poco se menciona sobre el rol de la inversión en ciencia. Mucho inversor y poco investigador. La innovación, por lo tanto, se da por la atracción de capital y de tecnologías desarrolladas por otros más que por un proceso autónomo de construcción tecnológica a partir de la inversión en ciencia. No resulta para nada casual que casi la mitad del presupesto asignado a investigación suela estar constituida por créditos destinados al I+D+I de empresas (en colaboración con la universidad).
Análisis temático
¿Cuáles códigos tienen más peso? ¿Qué categorías se asocian de forma más estrecha? Una vez creados los códigos y los diccionarios, cabe dar un paso adelante y buscar patrones, identificar las características de los conjuntos de términos y sus relaciones con otros atributos en los textos.
El análisis de la incidencia de los códigos en un corpus y su interrelación permiten explicitar patrones y definir el peso relativo de cada idea en los textos. Este apartado emplea tres estrategias para explorar la importancia de los temas. La primera consiste en averiguar el peso de las categorías, es decir, emplear estadísticas sumarias, como la frecuencia relativa de códigos o expresiones, para establecer su prevalencia. La segunda se basa en la desagregación y el filtro para comparar grupos o atributos o para seleccionar aspectos concretos que se desean examinar con más detenimiento. La tercera investiga su asociación por medio de las redes de coocurrencia.
Combinadas, tales estrategias permiten identificar los temas centrales presentes en un texto o corpus y cómo se relacionan entre sí. También revelan su variación de acuerdo con variables contextuales, como puede ser un partido, el presidente o un período de tiempo determinado. Se tratan de herramientas sencillas, pero muy útiles, a la hora de contextualizar ideas e identificar variaciones importantes en el uso de conceptos o términos.
Estadísticas temáticas
Denominamos estadísticas temáticas el conjunto de técnicas cuantitativas que permiten representar la importancia de categorías o expresiones en un corpus. ¿Cuántas veces los presidentes de gobierno han mencionado la ciencia en sus discursos de investidura? ¿Cuántas han mencionado al terrorismo? ¿Quiénes han sido los que más uso han hecho de la expresión “género” o “fuerzas de seguridad”?
Por lo tanto, aunque sencillas, tales herramientas permiten delinear diferencias programáticas e ideológicas entre distintos actores políticos. Sobre todo, señala aquellas categorías más frecuentes, tanto por el número de veces que aparecen como por la cantidad de documentos en los que aparecen. Por ejemplo, solo algunos de los presidentes mencionan el tema de género en sus discursos (en especial José Luis Rodríguez Zapatero y Pedro Sánchez). No obstante, temas como el mercado laboral o la fiscalidad del Estado, como esperado, aparecen en todos ellos (aunque acompañados de distintos calificativos).
El panel abajo contiene un conjunto de recursos para el análisis de los códigos del diccionario dic.pol.es aplicado a los discursos de investidura de los presidentes de gobierno de España. La primera pestaña (tabla) contiene la frecuencia relativa de los códigos y términos del diccionario en el corpus. Las demás corresponden a visualizaciones que permiten hacer una síntesis de los pesos relativos de palabras-clave y categorías en los textos. Force Directed Tree genera un diagrama de árbol que representa la jerarquía de los términos como una red. Las dos alternativas siguientes (voronoi tree) generan una imagen parecida, pero con otros instrumentos de interacción y niveles de zoom. Esto permite mirar hacia los resultados de una forma ligeramente distinta.
La función countKeywords de tenet produce un data.frame con un conjunto de campos que auxilian en el análisis del peso relativo de cada categoría en un corpus determinado. El primero es groups, que indica el grupo (como partido o presidente, por ejemplo) que detalla los resultados. Si no se ha informado ninguna variable de grupo, aparecerá “All” (todos). El segundo, level1, señala el código de más alto nivel en un diccionario (la función admite hasta dos niveles de jerarquía, en esos casos aparecería también level2). El tercero, keyword, indica la palabra-clave que conforma el diccionario y frequency muestra la frecuencia (absoluta o relativa del término en el corpus).
La tabla abajo muestra la frecuencia relativa (por cada mil palabras) de cada término del diccionario dic.pol.es en el corpus de discursos de investidura de los presidentes españoles.
Código
# Calcula la frecuencia relativa en que cada
# palabra ha sido encontrada para cada nivel
# del diccionario
xy <- countKeywords(cp,
dic.pol.es,
rel.freq = T,
quietly = TRUE)
# Elimina los términos no encontrados
xy <- xy[xy$frequency>0,]
# Puesto que es una frecuencia relativa
# multiplicamos por 10 mil para tener la
# ratio de ocurrencia a cada 10 mil palabras
xy$frequency <- round(xy$frequency*10000, 1)
# Visualiza los resultados
reactable::reactable(xy,
resizable = T)Si ordenamos por frecuencia, vemos que la categoría más general de discurso y, dentro de esta, España, se destaca. A ella le sigue la figura retórica de “Señor”, que incluye todas las formas derivadas: señor, señora, señoría, señores, y demás. Se trata también de una forma de tratamiento común en este tipo de texto en los que los candidatos a presidente de gobierno se refieren de forma respetuosa a los demás representantes parlamentarios.
Aunque la tabla nos brinde los detalles de la frecuencia de cada término, una visualización de todos los códigos a la vez posibilita entender su peso relativo de forma instantánea y comparada. Un diagrama de árbol (force directed tree) representa cada categoría en el diccionario como un árbol en el que cada código es una rama y cada elemento una hoja que se atraen o repulsan de acuerdo con su peso relativo (Holten 2006). El tamaño de cada círculo (rama o hoja) se define de acuerdo con su frecuencia y el color según el nivel más alto en el diccionario. A mayor peso, más centralidad en el gráfico. De acuerdo con el ejemplo que se emplea aquí, discurso tendrá un color, social otro, exterior el suyo y así sucesivamente. Cada una de esas categorías abarcadoras mantendrá la misma estructura de códigos secundarios y expresiones (o keywords) como figuran en el diccionario.
Código
# Genera el gráfico de árbol
forceDirectedTree(xy,
value_col = "frequency",
attraction = -8,
palette = pal$cat.awtools.bpalette.16,
max.radius = 18,
height = 500)Como se puede ver, la categoría discurso es la que más peso tiene en el corpus. Está conformada por expresiones de tratamiento como “señorías” o “investidura” y relacionadas a España, como “españoles”, “patria” o “pueblo”. Viene seguida de temas sociales, de política exterior y fiscales.
Un treemap corresponde a otra forma de visualización de datos jerárquicos. En este caso, todas las categorías y sus subcategorías se dividen en un círculo fragmentado en partes que se dimensionan según la frecuencia de cada código (Balzer and Deussen 2005).
Código
# Agrega las frecuencias según los dos niveles
# de código contenidos en el diccionario
xx <- aggregate(list(frequency=xy$frequency),
by=list(level1=xy$level1,
level2=xy$level2),
sum, na.rm=TRUE)
# Genera el gráfico
plotVoronoiTree(data = xx,
value_col = "frequency")Al hacer clic sobre una categoría, el gráfico hace un zoom y redistribuye el espacio solo con las subcategorías del código principal seleccionado.
El ejemplo abajo repite el gráfico anterior, pero ahora con las palabras-clave como unidades de división de las áreas del círculo. Aquí se pueden observar el peso relativo de cada expresión en la configuración de cada código.
Código
# Agrega las frecuencias según el primer
# nivel de código y las palabras clave
# contenidas en el diccionario
xx <- aggregate(list(frequency=xy$frequency),
by=list(level1=xy$level1,
keyword=xy$keyword),
sum, na.rm=TRUE)
# Genera el gráfico
plotVoronoiTree(data = xx,
value_col= "frequency")Un análisis rápido de los resultados subraya la importancia de formas retóricas y puramente discursivas en el corpus. El uso de expresiones de tratamiento, como señorías, o relativos a España o los españoles predomina por su reiterada aparición. El tamaño de la categoría “discurso” en todas las visualizaciones manifiesta claramente su predominio sobre los demás temas.
La segunda categoría de mayor importancia se encuentra relacionada con temas sociales. No sorprende que las cuestiones laborales, y en particular el empleo, constituyan elementos centrales de los discursos de todos los presidentes. Con relación a las demás áreas de política social, se percibe un destaque muy particular a la educación. Se trata de un tema alrededor del que los distintos partidos siempre han marcado sus diferencias programáticas. Tal protagonismo se ve reflejado en los discursos de investidura.
En política exterior, pesa mucho más Europa frente a otros temas y al resto del mundo. Se observa una clara orientación hacia el contexto regional frente a otros vínculos políticos más tradicionales. Este patrón se puede verificar claramente en la falta casi absoluta de protagonismo de América Latina en los textos.
La mención a distintos actores sociales también resulta útil para entender la relación de los presidentes con diferentes sectores de la sociedad civil. En el corpus analizado, queda claro el destaque atribuido a las empresas y empresarios, vistos como promotores de crecimiento económico. En segundo lugar, hay muchas referencias al propio partido o a aquellos que forman parte de la coalición de gobierno. Los trabajadores ocupan el último lugar.
El tema territorial aparece, principalmente, bajo la forma de acción administrativa del Estado hacia comunidades autónomas y la administración local. No obstante, otros temas vinculados con la dimensión territorial de la organización del Estado español, como el regionalismo y el terrorismo, también presentan cierto destaque.
La tecnología es vista como un motor de desarrollo. No obstante, la ciencia ocupa un rol marginal. En varios discursos, se trata de dar incentivos a empresas y atraer tecnologías desarrolladas en otros países más que crear un sistema de investigación robusto que permita la innovación desde España.
En relación a las categorías postmaterialistas, se observan dos patrones. El medioambiente conforma el tema con más peso y con un carácter más transversal. De una forma o de otra, todos los presidentes lo consideran un problema a atajar. No obstante, la diversidad sexual constituye un divisor de aguas. Aparecen con una frecuencia significativamente mayor en los discursos de los dos últimos presidentes socialistas y constituyen, de cierto modo, una marca de sus programas de gobierno.
Temas por atributo
¿Cómo distintos partidos mencionan un tema? ¿Y los presidentes? En muchas ocasiones, el punto central del análisis consiste en comparar cómo los temas varían según un atributo cualquiera como, por ejemplo, la ideología, el tiempo, o distintas regiones o países.
En algunos casos, interesa desagregar los datos generales por atributo y examinar cómo los patrones varían según cada valor o grupo. En otros, el objetivo consiste el filtrar o seleccionar algunos valores para explorarlos en profundidad. La capacidad de manipulación de datos representa uno de los puntos fuertes de R. Resulta muy sencillo realizar búsquedas y selecciones de datos a partir de criterios lógicos. Por esa razón, emplear tales capacidades en favor de un análisis de datos más detallado consiste en algo sencillo.
El panel abajo desagrega los datos presentados anteriormente por partidos y por presidente, así como filtra los resultados solo para el código “postmaterialismo”. En las pestañas tabla, se presentan las frecuencias desagregadas por ambas variables y, en las pestañas Sankey, se presentan los datos en un diagrama aluvial conocido como diagrama de Sankey (A. B. W. Kennedy and Sankey 1898; Riehmann, Hanfler, and Froehlich 2005).
La tabla abajo presenta las frecuencias relativas desagregadas por partido de cada código y expresión contenida en el diccionario dic.pol.es. Como en los ejemplos anteriores, se ha empleado el corpus de los discursos de investidura de los presidentes de gobierno de España. La única diferencia con el ejemplo anterior está en el uso del parámetro group.var=“Partido” en la función countKeywords, que establece que los resultados ahora deben ser desagrupados por el partido político del presidente.
Código
# Carga el paquete quanteda
library(quanteda)
# Añade la variable partido al corpus cp
# que hemos creado anteriormente
docvars(cp, "Partido") <- c("UCD", "UCD", "PSOE",
"PSOE", "PSOE", "PSOE",
"PP", "PP", "PSOE",
"PSOE", "PP", "PP",
"PP", "PSOE", "PSOE")
# Obtiene la frecuencia relativa de los
# términos contenidos en el diccionario
# dic.pol.es desagregados por la variable
# partido.
xp <- countKeywords(cp,
dic.pol.es,
rel.freq = T,
group.var = "Partido",
quietly = TRUE)
# Agrega los resultados por los dos niveles
# de código del diccionario
xx <- aggregate(list(frequency=xp$frequency),
by=list(groups=xp$groups,
level1=xp$level1,
level2=xp$level2),
sum, na.rm=T)
# Elimina los términos no encontrados
# en el corpus
xx <- xx[xx$frequency>0,]
# Multiplica la frecuencia relativa por mil
# para facilitar la visualización de los
# valores.
xx$frequency <- round(xx$frequency*1000,2)
# Visualiza los resultados
reactable(xx,
filterable = T,
resizable = T)El diagrama de Sankey abajo representa los resultados de la tabla anterior. Cada barra de la izquierda corresponde a un partido y de la derecha a un código del diccionario. Los vínculos de cada partido a cada categoría se hacen visible cuando se pasa el cursor sobre una de las barras. Si el cursor está sobre un partido, se muestran sus vínculos con todas las categorías. Si, por otra parte, se pone sobre una categoría, se señalan todos los partidos y la intensidad con la que se vinculan.
Código
# Agrega las frecuencias relativas según
# el grupo (partido) y el segundo nivel
# de códigos (más detallado)
xx <- aggregate(list(frequency=xp$frequency),
by=list(groups=xp$groups,
level2=xp$level2),
sum, na.rm=T)
# Elimina los términos no encontrados
# en el corpus
xx <- xx[xx$frequency>0,]
# Multiplica la frecuencia relativa por mil
# para facilitar la visualización de los
# valores.
xx$frequency <- round(xx$frequency*1000,2)
# Genera el gráfico
plotSankey(xx,
from = "groups",
to="level2",
value = "frequency",
opacity = 0.05)Si pasamos el cursor sobre el código “democracia”, por ejemplo, vemos que la UCD contiene el mayor número de menciones. Se trata de algo absolutamente esperado, puesto que los presidentes de este partido (Adolfo Suárez y Leopoldo Calvo-Sotelo) han sido los primeros a ocupar el cargo durante la transición a la democracia. Si consideramos los términos “España” y “empresas” vemos que el PP, a su vez, contiene un mayor protagonismo, aunque en el último caso, su preponderancia resulta modesta frente a los demás grupos políticos.
En este caso, los datos se desagregan por presidente.
Código
# Obtiene la frecuencia relativa de los
# términos contenidos en el diccionario
# dic.pol.es desagregados por la variable
# President.
xz <- countKeywords(cp,
dic.pol.es,
rel.freq = T,
group.var = "President",
quietly = TRUE)
# Agrega los resultados por: los grupos
# (cada uno de los presidentes) y los dos
# niveles de código del diccionario
xx <- aggregate(list(frequency=xz$frequency),
by=list(groups=xz$groups,
level1=xz$level1,
level2=xz$level2),
sum, na.rm=T)
# Elimina los términos no encontrados
# en el corpus
xx <- xx[xx$frequency>0,]
# Multiplica la frecuencia relativa por mil
# para facilitar la visualización de los
# valores.
xx$frequency <- round(xx$frequency*1000,2)
# Visualiza los resultados
reactable(xx,
filterable = T,
resizable = T)El mismo diagrama, pero ahora desagregado por presidente.
Código
# Agrega las frecuencias relativas según
# el grupo (presidentes) y el segundo nivel
# de códigos (más detallado)
xx <- aggregate(list(frequency=xz$frequency),
by=list(groups=xz$groups,
level2=xz$level2),
sum, na.rm=T)
# Elimina los términos no encontrados
# en el corpus
xx <- xx[xx$frequency>0,]
# Multiplica la frecuencia relativa por mil
# para facilitar la visualización de los
# valores.
xx$frequency <- round(xx$frequency*1000,2)
# Genera el gráfico
plotSankey(xx,
from = "groups",
to="level2",
value = "frequency",
opacity = 0.05)Aquí vemos cómo cada presidente utiliza los términos. Resulta muy llamativo el uso de expresiones relacionadas a “España” por Mariano Rajoy, “genero” por Pedro Sánchez o “fiscal” por Aznar. Tales códigos les destacan frente a los demás y nos permiten identificar las características de sus discursos que les singularizan.
Filtrado de valores
También podemos filtrar los valores para centrar la atención a una categoría o código específico. En algunos casos, como género o medioambiente, por ejemplo, resulta difícil ver las diferencias en un gráfico dada su pequeño peso frente a otras categorías más frecuentes. En el ejemplo abajo, seleccionamos solamente los códigos de segundo nivel relacionados al “postmaterialismo”, es decir, cuestiones de género, medioambiente y memoria histórica.
Código
# Filta el resultado de los presidentes
# para mantener solo los valores relativos
# a la categoría "postmaterialismo"
x1 <- xz[xz$level1=="postmaterialismo",]
# Agrega las frecuencias relativas según
# el grupo (presidentes) y el segundo nivel
# de códigos (más detallado)
xx <- aggregate(list(frequency=x1$frequency),
by=list(groups=x1$groups,
level2=x1$level2),
sum, na.rm=T)
# Elimina los términos no encontrados
# en el corpus
xx <- xx[xx$frequency>0,]
# Multiplica la frecuencia relativa por mil
# para facilitar la visualización de los
# valores.
xx$frequency <- round(xx$frequency*1000,2)
# Genera el gráfico
plotSankey(xx,
from = "groups",
to="level2",
value = "frequency",
opacity = 0.05)Como vemos, en los temas postmateriales hay un predominio de presidentes de gobierno del PSOE, en especial Zapatero y Sánchez. No obstante, en algunos temas como la memoria histórica y el medioambiente, presidentes de otros partidos también aparecen con menciones, aunque en menor grado.
Redes temáticas
¿Qué códigos siempre se mencionan juntos? ¿Qué otros nunca aparecen en una misma frase, párrafo o documento? El análisis de la asociación entre categorías constituye otro recurso muy útil para identificar patrones en los textos y facilitar el análisis del contenido de los mismos. Dicha tarea constituye el núcleo del desarrollo de redes temáticas, construidas a partir de la abstracción de códigos hacia conjuntos interrelacionados de temas (Attride-Stirling 2001). En los discursos políticos términos como democracia o libertad tienden a estar asociados a otras expresiones que les califican y permiten asignar una posición ideológica concreta. Por ese motivo, el análisis de las redes de asociación temática permiten avanzar aún más en la comprensión de los patrones existentes en el contenido de los documentos que componen un corpus.
El panel abajo trabaja con dos niveles. El primero examina la relación entre códigos de más alto nivel como actores, instituciones, política exterior o fiscal. El segundo baja un escalón y trata de los códigos menos abstractos como laboral, europa, retorica, genero. Para cada nivel los datos se muestran tanto bajo la forma de una tabla con los términos y el número de veces que aparecen juntos como en un diagrama de cuerdas (chord diagram) que permite la visualización de redes cuyos nodos se encuentran densamente asociados entre sí (Bremer and Wu 2012).
La tabla abajo ha sido producida a partir de la función matchCodes que examina la coocurrencia de los códigos de un diccionario determinado en un corpus. Aquí se emplean los discursos de investidura organizados según sentencias y se busca mapear la asociación entre los códigos de más alto nivel del diccionario dic.pol.es. El resultado es un data.frame con tres columnas: term1, correspondiente al primer término, term2, representando el segundo código, y value, que contiene el número de veces en que esas dos categorías aparecen en una misma unidad textual del corpus (sentencia, párrafo o documento entero).
Código
# Reorganiza el corpus según
# sentencias o frases
cs <- corpus_reshape(cp, "sentences")
# Calcula la frecuencia en la
# que dos codigos del mismo
# diccionario aparecen juntos
# en cada frase
d1 <- matchCodes(cs,
dic.pol.es,
level = 1,
quietly=TRUE)
# Ordena los resultados de mayor a menor
d1 <- d1[order(d1$value, decreasing = T),]
# Visualiza los resultados
# Obs.: En esta versión el código resulta
# más largo porque incluímos un gráfico de
# barras en la tabla. Si no quisiéramos ver
# el gráfico bastaría con el código:
# > reactable(d1)
library(htmltools)
# Crea una función que transformará
# los valores de frecuencia en
# barras a ser representadas en una
# o más columnas de la tabla.
bar_chart <- function(label,
width = "100%",
height = "1rem",
fill = "purple",
background = NULL) {
bar <- div(
style = list(
background = fill,
width = width,
height = height)
)
chart <- div(
style = list(
flexGrow = 1,
marginLeft = "0.5rem",
background = background),
bar)
div(
style = list(
display = "flex",
alignItems = "center"),
label,
chart)
}
# Visualiza los resultados
reactable::reactable(
d1,
resizable = T,
filterable = T,
columns = list(
value = colDef(
name = "value",
align = "left",
cell = function(value) {
width <- paste0(
value / max(d1$value) * 100,
"%")
bar_chart(value, width = width)
}
)
)
)Al examinar los resultados, la díada más frecuente corresponde a discurso-instituciones, con 746 ocurrencias, seguida de discurso-exterior, con 489, y discurso-social, con 358. Las menos frecuentes son instituciones-postmaterialismo, con 4 ocurrencias, y defensa-postmaterialismo, con 5.
El diagrama de cuerdas abajo revela el patrón en su conjunto, algo más difícil de observar solo por el examen de la tabla anterior. Además de discurso, temas sociales, e instituciones son los que más se asocian entre sí y con las demás categorías. Postmaterialismo, defensa y tecnología los que menos.
Código
# Genera el gráfico
plotChord(d1,
from = "term1",
to ="term2",
value= "value")La tabla abajo repite la operación, pero ahora para las categorías de segundo nivel. Ahora, la díada parlamento-retorica predomina, con 344 apariciones. España-retorica viene en segundo lugar, con 299 ocurrencias. Se tratan claramente de referencias al mismo Congreso de los Diputados y a los españoles y a España. Tales asociaciones corresponden a lo que ya hemos visto en análisis anteriores.
Código
# Reordena el corpus según sentencia
# o frase.
cs <- corpus_reshape(cp, "sentences")
# Calcula las coocurrencias, pero ahora
# para el segundo nivel del diccionario
d2 <- matchCodes(cs,
dic.pol.es,
level = 2,
quietly=TRUE)
# Ordena de los mayores a menores valores
d2 <- d2[order(d2$value, decreasing = T),]
# Visualiza los resultados
# Obs.: En esta versión el código resulta
# más largo porque incluímos un gráfico de
# barras en la tabla. Si no quisiéramos ver
# el gráfico bastaría con el código:
# > reactable(d1)
library(htmltools)
# Crea una función que transformará
# los valores de frecuencia en
# barras a ser representadas en una
# o más columnas de la tabla.
bar_chart <- function(label,
width = "100%",
height = "1rem",
fill = "purple",
background = NULL) {
bar <- div(
style = list(
background = fill,
width = width,
height = height)
)
chart <- div(
style = list(
flexGrow = 1,
marginLeft = "0.5rem",
background = background),
bar)
div(
style = list(
display = "flex",
alignItems = "center"),
label,
chart)
}
# Visualiza los resultados
reactable::reactable(
d2,
resizable = T,
filterable = T,
columns = list(
value = colDef(
name = "value",
align = "left",
cell = function(value) {
width <- paste0(
value / max(d2$value) * 100,
"%")
bar_chart(value, width = width)
}
)
)
)El diagrama de cuerdas abajo señala las relaciones entre las categorías de segundo nivel. Las categorías que más se vinculan a otras son retórica, España, administración y otros temas de carácter social. Las menos asociadas son género, policía, memoria histórica y medioambiente.
Código
# Genera el gráfico
plotChord(d2,
from = "term1",
to ="term2",
value= "value")Code
plotGrid(d2, standardize = T,
palette = pal$cat.ggsci.ucscgb.26,
x="term1",
y="term2",
size="value",
color="term1",
width_svg = 12, height_svg = 8,
leg.size="Menciones",
leg.color="Código/Tema",
grid.color="grey99")Consideraciones finales
En esta parte hemos explorado el uso de estrategias de análisis que facilitan la selección, la codificación y el análisis temático de textos. Como ya ha sido mencionado de forma extensiva, no se trata de reemplazar métodos cualitativos tradicionales, sino de ofrecer entradas alternativas para el análisis de contenido. La mayoría de las técnicas presentadas aquí tienen en mente un contexto híbrido de investigación. De un lado, se desea mantener al máximo el rigor de un examen en profundidad del corpus. De otro, se quiere expandir el abanico de opciones disponibles para la identificación de patrones, su comunicación y el desarrollo de nuevas ideas.
Cabe subrayar que, aunque las estrategias desarrolladas aquí tengan en mente corpus con un número elevado de textos, las herramientas que se han presentado pueden emplearse también para una cantidad pequeña de documentos. Entrevistas, libros, cuadernos de campo, todos pueden ser objeto de la aplicación de los métodos discutidos aquí. Para un investigador acostumbrado a estudios cuantitativos, representa una oportunidad para examinar nuevas fuentes de información con mayor profundidad. Para los que se basan en métodos cualitativos, se abre la posibilidad de expandir sus instrumentos de trabajo con nuevas formas de visualización y exploración del material empírico con el que trabajan.
Ejercicios
Ejercicio 1. Keyword in Context (kwic). Utilice la función kwic para buscar el término “igualdad” en el corpus de los discursos de investidura de los presidentes de gobierno españoles. Utilice una ventana de 7 palabras antes y después.
Solución
# Carga los paquetes tenet y quanteda
library(tenet)
library(quanteda)
# Crea un corpus (discursos inaugurales Espana)
cp <- corpus(spa.inaugural)
# Crea un data.frame a partir de
# la funcion Keyword in Context de
# Quanteda
d <- kwic(x = tokens(cp),
pattern= "igualdad",
window = 7)
# Visualiza los resultados
View(d)Ejercicio 2. Árbol de palabras. Crea un árbol de palabras empleando el mismo corpus y la misma palabra del ejercicio anterior. Puedes intentarlo también con otras palabras de tu interés.
Solución
# Crea un arbol de palabras en tenet
wordtree(corpus = cp,
keyword = "igualdad",
height = 800)
# Palabra alternativa: empleo
# (puede ser cualquiera que elijas)
wordtree(corpus = cp,
keyword = "empleo",
height = 800)Ejercicio 3. Etiquetado de textos. Seleccione el último discurso inaugural de Pedro Sánchez (texto 15) de la base de datos spa.inaugural y emplee las palabras clave “tecnol”, “ciencia”, “científ”, y “digital”.
Solución
# Examina un conjunto de palabras en el
# discurso de investidura de Adolfo Suárez
tagText(as.character(spa.inaugural$text[15]),
keywords = c("tecnol",
"digital",
"ciencia",
"científ"),
title = "Pedro Sanchez (2019)")Ejercicio 4. Etiqueta do textos con diccionario. Repita el ejercicio anterior. No obstante, ahora, utilice el diccionario de la sección “Diccionarios como colecciones de códigos” para etiquetar el texto de Pedro Sánchez. Utilice la paleta de colors “FantasticFox1” para colorear las categorías, un tamaño de fuente de 20 y unos márgines de 120 pixeles.
Solución
# Crea el diccionario
dic <- dictionary(
list(
economica=c("econom",
"inversion",
"empresa",
"desarroll",
"monetari",
"industri",
"agric",
"agrari"),
fiscal=c("hacienda",
"gasto",
"impuest",
"presupuest",
"tribut",
"tasa",
"fiscal"),
educacion=c("educa",
"profesor",
"docent",
"escuel",
"colegio",
"universi",
"formación"),
sanidad=c("sanidad",
"salud",
"hospital",
"sanitari",
"médic",
"enfermer",
"salud"),
medioambiente=c("sostenible",
"cambio clima",
"medioambient",
"reciclaje",
"ecológico",
"límpia",
"invernadero",
"emisiones",
"carbono",
"plástico",
"fósiles")))
# genera un texto para ser leído en el panel
# Viewer de RStudio
tagText(spa.inaugural$text[15],
keywords = dic,
palette = pal$cat.wesanderson.FantasticFox1.5,
font.size = 20,
title = "Pedro Sanchez (2019)",
margin = 120)Ejercicio 5. Etiquetado de corpus. Ahora emplee el mismo diccionario para etiquetar todo el corpus de discursos de investidura. Reorganice los documentos en párrafos (“paragraph”) en lugar de emplear documentos enteros.
Solución
# La función tagCorpus etiqueta
# todo un corpus de acuerdo con un
# diccionario
tagCorpus(cp,
dic,
reshape.to = "paragraph")Ejercicio 6. Etiquetado de corpus. Ahora repita el último ejercicio. Pero ahora crea un nuevo diccionario con los términos que más te interesen.
Solución
# Crea un nuevo diccionario, he elegido
# algunas políticas públicas concretas
dic.nuevo <- dictionary(
list(
gobierno=c("gobierno",
"instituciones",
"comunidades",
"autonom",
"administracion",
"entidades"),
politica=c("politica",
"partido",
"accion",
"cortes"),
patria=c("patria",
"nacion",
"espanoles",
"pueblo"),
justicia=c("constituci",
"justicia",
"judic",
"ley",
"legal"),
financiero=c("financ",
"hacienda",
"presupuesto",
"tributa",
"fiscal"),
equidad=c("desigual",
"igualdad")))
# Etiqueta los textos según el nuevo
# diccionario
tagCorpus(cp,
dic.nuevo,
reshape.to = "paragraph")Ejercicio 7. Estadísticas temáticas. Utilice el diccionario empleado en el ejercicio 4 para contar la frecuencia de cada código en el corpus de discursos de investidura. Recuerda que debes utilizar la función countKeywords. No elimine los códigos con frecuencia igual a cero y utilice la frecuencia absoluta.
Solución
# Calcula la frecuencia ABSOLUTA en que cada
# palabra ha sido encontrada para cada nivel
# del diccionario dic
xy <- countKeywords(cp,
dic,
quietly = TRUE)
# Visualiza los resultados
reactable::reactable(xy,
resizable = T,
filterable = T)Ejercicio 8. Diagrama de árbol. Utilice los resultados del ejercicio anterior para crear un diagrama de árbol (Force Directed Tree). No obstante, ahora elimine las palabras clave con frecuencia igual a cero. Utilice “level1” y “keywords” como grupos y “keywords” como elementos.
Solución
# Elimina los valores con frecuencia
# igual a cero
xy <- xy[xy$frequency>0,]
# Formatea los datos para que puedan
# ser representados en el gráfico
js <- jsonTree(data = xy,
groups=c("level1","keyword"),
elements = "keyword",
value="frequency")
# Genera el gráfico
forceDirectedTree(js)Ejercicio 9. Árbol de Voronoi. Utilice los resultados del ejercicio 7 para crear ahora un diagrama de Voronoi (Voronoi Treemap). No obstante, ahora elimine las palabras clave con frecuencia igual a cero. Utilice “level1” y “keywords” como grupos y “keywords” como elementos.
Solución
# Genera el gráfico
plotVoronoiTree(data = xy,
groups = "level1",
elements = "keyword",
value = "frequency")Ejercicio 10. Estadísticas temáticas: filtro. Repita la operación del ejercicio 7, pero ahora desagrega los resultados por presidente y emplea la frecuencia relativa.
Solución
# Calcula la frecuencia ABSOLUTA en que cada
# palabra ha sido encontrada para cada nivel
# del diccionario dic
xy <- countKeywords(cp,
dic,
group.var = "President",
quietly = TRUE,
rel.freq = T)
# Visualiza los resultados
reactable::reactable(xy,
resizable = T,
filterable = T)Ejercicio 11. Diagrama aluvial de Sankey. Genere un diagrama de Sankey con los resultados del ejercicio anterior. No olvides de agregar los valores por grupo (“groups”) y por código (“level1”) y eliminar los códigos con frecuencia igual a cero.
Solución
# Agrega los resultados por presidente y
# por código del diccionario
xx <- aggregate(list(frequency=xy$frequency),
by=list(groups=xy$groups,
level1=xy$level1),
sum, na.rm=T)
# Elimina los términos sin correspondencia
# en el corpus
xx <- xx[xx$frequency>0,]
# General el gráfico
plotSankey(xx,
from = "groups",
to="level1",
value = "frequency")Ejercicio 12. Coocurrencia de códigos. Reorganice el corpus en el nivel de párrafos. Calcule las coocurrencias de los códigos del diccionario dic.
Solución
# Reorganiza el corpus según párrafos
cs <- corpus_reshape(cp, "paragraph")
# Calcula las coocurrencias
d1 <- matchCodes(cs,
dic,
level = 1,
quietly=TRUE)
# Ordena las frecuencias de mayor a menor
d1 <- d1[order(d1$value, decreasing = T),]
# Visualiza los resultados
View(d1)Ejercicio 13. Diagrama de cuerdas. Utilice los resultados del ejercicio anterior para crear un diagrama de cuerdas que permita visualiza las conexiones entre los distintos términos del diccionario dic aplicado al corpus de discursos de investidura.
Solución
# Visualiza los resultados
plotChord(d1,
from = "term1",
to ="term2",
value= "value")Lecturas adicionales
Attride-Stirling J (2001). “Thematic networks: an analytic tool for qualitative research.” Qualitative research, 1(3), 385-405.
Con un número de 8.178 citas en Google Académico, el artículo de Attride-Stirling se ha convertido en referencia casi obligatoria en el proceso de codificación temática. Se destaca por presentar los temas no como ideas sueltas creadas a partir de códigos, sino como redes jerárquicas que van desde los referentes empíricos (en nuestro caso los textos) hasta el tema central del estudio.
Kennedy BL, Thornberg R (2018). “Deduction, induction, and abduction.” In The SAGE handbook of qualitative data collection, chapter 4, 49-64. SAGE Publications, London.
El texto de Kennedy y Tornberg representa una excelente introducción a las lógicas inductiva, deductiva y abductiva. Su consulta resulta muy recomendable, si deseas conocer más sobre las principales características y diferencias entre esos tipos de razonamiento o métodos de construcción de conocimiento.
Saldana J (2015). The Coding Manual for Qualitative Researchers Third Edition. SAGE, Los Angeles ; London.
El libro de Saldaña corresponde a una guía detallada del proceso de codificación temática. No solo detalla los distintos tipos de código como sugiere algunas heurísticas para aplicarlos a los textos. Se trata de una referencia básica para el proceso de creación de códigos.
Thompson J (2022). “A guide to abductive thematic analysis.” The Qualitative Report, 5(27), 1410-1421.
El breve artículo de Thompson suministra una guía paso a paso de cómo emplear un razonamiento abductivo en el análisis temático en las ciencias sociales. Constituye una lectura interesante para aquellos que desean una orientación más detallada de cómo llevar a cabo el proceso de análisis de texto.